﻿/*************************************************************************************
 * 文 件 名:   IHK_SimpleTaskSystem
 * 
 * 描    述:   简单版任务管理系统
 * 
 * 版    本：  V1.1
 * 创 建 者：  京产肠饭
 * 创建时间：  2021/10/31
 * 链   接：  https://gitee.com/JingChanChangFan/hk_-unity-tools
*************************************************************************************/

using System;
using System.Collections.Generic;
using QFramework;
using UnityEngine;

public enum TaskQueueName
{
    TQ_01,
    TQ_02,
    TQ_03,
    TQ_04
}

public enum TaskName
{
    TQ_01_步骤01_放置干扰天线支架,
    TQ_01_步骤02_安装干扰天线,
    TQ_01_步骤03_连接干扰天线与干扰源,
    TQ_01_步骤04_放置抗干扰天线支架,
    TQ_01_步骤05_安装抗干扰天线,
    TQ_01_步骤06_连接抗干扰天线与电脑,
    TQ_01_步骤07_将干扰天线对准抗干扰天线,
    TQ_01_步骤08_放置标定天线,
    TQ_01_步骤09_标定天线连接频谱仪,
    TQ_01_步骤10_打开干扰机,
}

public interface IHK_SimpleTaskSystem : ISystem
{
    /// <summary>
    /// 初始化一个任务流程
    /// </summary>
    void InitTaskQueue(TaskQueueName queueName, Action startAction, Action finishAction, List<HK_TaskItem> taskList);
    void StartTaskQueue(TaskQueueName queueName);
    void ClearTaskQueue(TaskQueueName queueName);
    void AddTask(TaskQueueName queueName, List<HK_TaskItem> taskList);
    void NextTask(TaskQueueName queueName);
    void CompleteAppointTask(TaskQueueName queueName, TaskName taskName);
}

public class HK_SimpleTaskSystem : AbstractSystem, IHK_SimpleTaskSystem
{
    Dictionary<TaskQueueName, HK_TaskQueue> TaskQueueDic;
    List<TaskQueueName> initedQueueList;

    protected override void OnInit()
    {
        TaskQueueDic = new Dictionary<TaskQueueName, HK_TaskQueue>();
        initedQueueList = new List<TaskQueueName>();
    }

    /// <summary>
    /// 初始化一个任务流程
    /// </summary>
    public void InitTaskQueue(TaskQueueName queueName, Action startAction, Action finishAction, List<HK_TaskItem> taskList)
    {
        if (initedQueueList.Contains(queueName))
        {
            Debug.Log("流程初始化失败，该任务流程已经被使用过");
            return;
        }

        HK_TaskQueue taskQueue = new HK_TaskQueue(startAction, finishAction, taskList);
        TaskQueueDic.Add(queueName, taskQueue);

        initedQueueList.Add(queueName);
    }

    // 添加任务
    public void AddTask(TaskQueueName queueName, List<HK_TaskItem> taskList)
    {
        TaskQueueDic[queueName].AddTask(taskList);
    }

    // 开始任务
    public void StartTaskQueue(TaskQueueName queueName)
    {
        TaskQueueDic[queueName].StartTask();
    }

    // 清空任务
    public void ClearTaskQueue(TaskQueueName queueName)
    {
        TaskQueueDic[queueName].ClearTask();
    }

    // 下一个任务
    public void NextTask(TaskQueueName queueName)
    {
        TaskQueueDic[queueName].NextTask();
    }

    // 根据任务名，完成指定的任务步骤
    public void CompleteAppointTask(TaskQueueName queueName, TaskName taskName)
    {
        TaskQueueDic[queueName].CompleteAppointTask(taskName);
    }
}

public class HK_TaskQueue
{
    // 开始任务时的回调
    public Action OnStartCallback = null;
    // 完成所有任务的回调
    public Action OnFinishCallback = null;
    // 任务队列
    public Queue<HK_TaskItem> taskQueue;

    public HK_TaskItem currentTask;

    int taskNum = 0;
    int taskCount = 0;

    // 当前任务进度
    public float TaskProcess
    {
        get { return taskNum * 1.0f / taskCount; }
    }

    public HK_TaskQueue(Action onStartCallback, Action onFinishCallback, List<HK_TaskItem> taskList)
    {
        this.OnStartCallback = onStartCallback;
        this.OnFinishCallback = onFinishCallback;
        this.taskQueue = new Queue<HK_TaskItem>();

        for (int i = 0; i < taskList.Count; i++)
        {
            taskQueue.Enqueue(taskList[i]);
        }

        taskCount = taskQueue.Count;

        taskNum = -1;
    }

    public void AddTask(List<HK_TaskItem> taskList)
    {
        for (int i = 0; i < taskList.Count; i++)
        {
            taskQueue.Enqueue(taskList[i]);
        }
    }

    public void StartTask()
    {
        if (OnStartCallback != null)
            OnStartCallback();

        NextTask();
    }

    public void NextTask()
    {
        if (taskQueue.Count > 0)
        {
            HK_TaskItem task = taskQueue.Dequeue();
            currentTask = task;
            task.initAction();

            taskNum++;
        }
        else
        {
            if (OnFinishCallback != null)
                OnFinishCallback();
        }

        Debug.Log(TaskProcess);
    }

    // 根据任务名，完成指定的任务步骤
    public void CompleteAppointTask(TaskName taskName)
    {
        if (currentTask.taskName == taskName)
            NextTask();
        else
            Debug.Log("当前任务不匹配");
    }

    public void ClearTask()
    {
        taskQueue.Clear();
    }
}

public class HK_TaskItem
{
    // 任务名
    public TaskName taskName;

    // 任务描述
    public string taskDescribe;

    // 具体任务内容，外部传入
    public Action initAction;

    public HK_TaskItem(Action initAction, TaskName taskName, string taskDescribe)
    {
        this.initAction = initAction;
        this.taskName = taskName;
        this.taskDescribe = taskDescribe;
    }
}
